package db

import (
	"gorm.io/gorm"
	"gorm.io/driver/postgres"
	"fmt"
	"xlq-demo/library/config"
	"xlq-demo/library/logger"
	"gorm.io/gorm/schema"
	"math/rand"
)

func init() {
	if len(dbms) > 0 {
		return
	}

	if config.Config == nil {
		panic("配置文件未加载")
	}

	//配置判断
	if len(config.Config.Dbm) == 0 {
		logger.Fatal("未配置主库，最少配置一个")
	}
	if len(config.Config.Dbs) == 0 {
		logger.Fatal("未配置从库，最少配置一个")
	}

	//设置主库
	for _,mc := range config.Config.Dbm {
		dbms = append(dbms,NewDb(&mc))
	}

	//设置从库
	for _,sc := range config.Config.Dbs {
		dbss = append(dbss,NewDb(&sc))
	}
}

var dbms []*gorm.DB
var dbss []*gorm.DB

func GetMaster() *gorm.DB {
	mLen := len(dbms)
	return dbms[rand.Intn(mLen)]
}

func GetSlave() *gorm.DB {
	sLen := len(dbss)
	return dbss[rand.Intn(sLen)]
}

func NewDb(cc *config.DB) *gorm.DB {
	dsn := fmt.Sprintf("host=%s port=%s user=%s password=%s dbname=%s sslmode=disable TimeZone=%s",
		cc.Host, cc.Port, cc.User, cc.Psd, cc.Name, cc.TimeZone,
	)
	pgDr := postgres.Open(dsn)

	db,err := gorm.Open(pgDr,&gorm.Config{
		NamingStrategy: schema.NamingStrategy{
			TablePrefix: cc.Prefix, // 表名前缀，`User` 的表名应该是 `t_users`
			SingularTable: true,                                    // 使用单数表名，启用该选项，此时，`User` 的表名应该是 `t_user`
		},
	})
	if err != nil {
		logger.Fatal(err)
	}
	sqlDb,err := db.DB()
	if err != nil {
		logger.Fatal(err)
	}
	sqlDb.SetMaxIdleConns(cc.MaxConnNum)
	sqlDb.SetMaxOpenConns(cc.MaxOpenNum)
	return db
}

